package com.fy56.platform.logistics.restful.api.controller;

import com.fy56.platform.logistics.restful.api.utils.StringToConversionUtil;
import com.fy56.platform.logistics.restful.api.utils.redis.RedisBusinessUtils;
import com.fy56.platform.logistics.restful.api.utils.weChat.SignUtil;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * [控制器类]微信服务
 */
@Controller
@RequestMapping("/wechatService")
public class WechatServiceController {

	@Autowired
	private RedisBusinessUtils redisBusinessUtils;

	/*----------------------------------------------------------------------------------------------------*/

	private static Logger log = Logger.getLogger(WechatServiceController.class);

	/*----------------------------------------------------------------------------------------------------*/

	/**
	 * 微信公众号_服务回调方法
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	@RequestMapping(value = "/getCallbackUtils", method = { RequestMethod.GET })
	@ResponseBody
	public void getCallbackUtils(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp，nonce参数
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");

		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			response.getOutputStream().println(echostr);
		}
//		//http://???/wechatService/getCallbackUtils

		//@----------------------------------------------------------------

//		// [获取]微信访问密钥(AccessToken)-测试
//		String accesstoken = redisBusinessUtils.getWxAppletAccessToken("wxc3b8bf78dd069937", "f41883811c877f787efb590d4c06e898");
////		// [获取]微信访问密钥(AccessToken)-正式
////		String accesstoken = redisBusinessUtils.getWxAppletAccessToken(ConstansUtils.SYS_CONSTANS.WECHAT_OFFICIAL_ACCOUNT_APPID, ConstansUtils.SYS_CONSTANS.WECHAT_OFFICIAL_ACCOUNT_SECRET);
//
//		// [接收]微信事件推送信息
//		Map<String, String> weChatMap = SignUtil.xmlToMap(request);
////		log.info("====>weChatMap:\t"+weChatMap.toString());
//
//		String menuId = weChatMap.get("MenuId");
//		if(menuId != null && !"".equals(menuId)) {
//			return;
//		}
//
//		String openid = weChatMap.get("FromUserName");// 用户openid
//		String msgType =  weChatMap.get("MsgType");//消息类型
//		//消息类型==event(事件)
//		if("event".equals(msgType)){
//			String event =  weChatMap.get("Event");//事件类型
//			switch (event) {
//			case "subscribe":
//				String ticket = weChatMap.get("Ticket");
//				if(StringToConversionUtil.isNotNull(ticket)){//二维码-扫码关注事件
//					executionQRCodeSubscribe(accesstoken, openid, weChatMap);//执行-二维码关注_响应方法
//				}else{//订阅事件
//					executionSubscribe(accesstoken, openid, "0");//执行-公众号订阅_响应方法
//				}
//				break;
//			case "unsubscribe"://取消订阅事件
//				executionUnsubscribe(openid);//执行-公众号取消订阅_响应方法
//				break;
//			case "SCAN"://二维码扫码(已关注)事件
//				executionQRCodeScan(openid);//执行-二维码扫码(已关注)_响应方法
//				break;
//			case "LOCATION"://上报地理位置事件
//				executionLocation(openid);//执行-上报地理位置_响应方法
//				break;
//			case "CLICK"://自定义菜单事件
//				executionClick(openid, weChatMap);//执行-自定义菜单_响应方法
//				break;
//			default:
//				break;
//			}
//		}
//		//消息类型==text(消息)
//		else if("text".equals(msgType)){
//			/*
//				用户向公众号发消息，就会触发这里
//				在此处可实现：
//					简单自动回复功能
//					或
//					根据消息内容，自动不同的消息
//			 */
//		}
	}

	/*----------------------------------------------------------------------------------------------------*/

	/**
	 * [响应方法]二维码关注
	 * @param openId
	 * @param weChatMap 微信事件推送信息
	 */
	private void executionQRCodeSubscribe(String accesstoken, String openId, Map<String, String> weChatMap){
		log.info("====>二维码关注_响应方法_开始");
		String eventKey = weChatMap.get("EventKey").toString();
		if(StringToConversionUtil.isNotNull(eventKey)){
			String sceneStr = eventKey.replace("qrscene_", "");

			List<String> scene = StringToConversionUtil.stringToList(sceneStr, "#");

			//[声明]自定义事件
			String event = "";
			for (String s : scene) {
				if(s.contains("event_")){
					event = s.replace("event_", "");
				}
			}

			//[判断]根据自定义事件,进行业务分流
			switch (event) {
			case "lawyerFollow"://律师扫码-二维码关注
				// 示例
				break;
			default:
				break;
			}
		}
		log.info("====>二维码关注_响应方法_结束 ");
	}

	/**
	 * [响应方法]公众号订阅
	 * @param accesstoken
	 * @param openid
	 * @param userType 用户类型[0普通用户,1村委会用户/司法所用户]
	 */
	private void executionSubscribe(String accesstoken, String openid, String userType){
		log.info("====>公众号订阅_响应方法_开始");
//		//[拼装]关注回复
//		String loginUrl = ConstansUtils.SYS_CONSTANS.interfaceServiceUrlRoot+"/userLogin.html";
//		String content = sysDictionaryService.getSysDictionary(DictionaryCode.WECHAT_FOLLOW_REPLY_USER).toString().replace("USER_LOGIN", loginUrl);
//		//[发送]关注回复
//		weChatInformation(openid, content);
		log.info("====>公众号订阅_响应方法_结束 ");
	}

	/**
	 * [响应方法]公众号取消订阅
	 * @param openid
	 */
	private void executionUnsubscribe(String openid){
		log.info("====>公众号取消订阅_响应方法_开始");
		log.info("====>公众号取消订阅_响应方法_结束 ");
	}

	/**
	 * [响应方法]二维码扫码(已关注)
	 * @param openid
	 */
	private void executionQRCodeScan(String openid){
		log.info("====>二维码扫码(已关注)_响应方法_开始");
		log.info("====>二维码扫码(已关注)_响应方法_结束 ");
	}

	/**
	 * [响应方法]上报地理位置
	 * @param openid
	 */
	private void executionLocation(String openid){
		log.info("====>上报地理位置_响应方法_开始");
		log.info("====>上报地理位置_响应方法_结束 ");
	}

	/**
	 * [响应方法]自定义菜单_响应方法
	 * @param openid
	 * @param weChatMap 微信事件推送信息
	 */
	private void executionClick(String openid, Map<String, String> weChatMap){
		log.info("====>自定义菜单_响应方法_开始");
		String eventKey = StringToConversionUtil.isNotNull(weChatMap.get("EventKey")) ? weChatMap.get("EventKey") : "";
		//示例
//		if("CLICK_01_MEDIATE_NOTICE".equals(eventKey)){//调解须知_发文
//			informationService.sendMediateNotice(openid);
//		}else if("CLICK_02_CONTACT_US".equals(eventKey)){//联系我们_发文
//			informationService.sendContactUs(openid);
//		}
		log.info("====>自定义菜单_响应方法_结束 ");
	}

	/**
	 * [响应方法]发送-自动回复消息
	 * @param openid
	 * @param content 回复消息
	 */
	private void weChatInformation(String openid, String content) {
		log.info("====>发送-自动回复消息_开始");
		log.info("====>发送-自动回复消息_结束 ");
	}

	/*----------------------------------------------------------------------------------------------------*/

}